use log::{info, warn, error, debug};
use std::path::PathBuf;
use std::fs;

#[cfg(target_os = "windows")]
use winreg::enums::*;
#[cfg(target_os = "windows")]
use winreg::RegKey;

/// 获取应用程序的可执行文件路径
fn get_exe_path() -> Result<PathBuf, String> {
    std::env::current_exe()
        .map_err(|e| format!("获取可执行文件路径失败: {}", e))
}

/// 获取应用程序名称
fn get_app_name() -> &'static str {
    "e-shortcuts"
}

/// 启用开机自启动
/// 
/// # Returns
/// * `Ok(())` - 启用成功
/// * `Err(String)` - 启用失败，包含错误信息
#[tauri::command]
pub fn enable_auto_start() -> Result<(), String> {
    info!("启用开机自启动");
    
    #[cfg(target_os = "windows")]
    {
        let exe_path = get_exe_path()?;
        let app_name = get_app_name();
        
        // 打开注册表项
        let hkcu = RegKey::predef(HKEY_CURRENT_USER);
        let run_key = hkcu
            .open_subkey_with_flags("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", KEY_SET_VALUE)
            .map_err(|e| format!("打开注册表Run项失败: {}", e))?;
        
        // 设置自启动项
        run_key
            .set_value(app_name, &exe_path.to_string_lossy().to_string())
            .map_err(|e| format!("设置自启动注册表项失败: {}", e))?;
        
        info!("已成功启用开机自启动: {} -> {}", app_name, exe_path.display());
    }
    
    #[cfg(not(target_os = "windows"))]
    {
        return Err("当前系统不支持自启动功能".to_string());
    }
    
    Ok(())
}

/// 禁用开机自启动
/// 
/// # Returns
/// * `Ok(())` - 禁用成功
/// * `Err(String)` - 禁用失败，包含错误信息
#[tauri::command]
pub fn disable_auto_start() -> Result<(), String> {
    info!("禁用开机自启动");
    
    #[cfg(target_os = "windows")]
    {
        let app_name = get_app_name();
        
        // 打开注册表项
        let hkcu = RegKey::predef(HKEY_CURRENT_USER);
        let run_key = hkcu
            .open_subkey_with_flags("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", KEY_SET_VALUE)
            .map_err(|e| format!("打开注册表Run项失败: {}", e))?;
        
        // 删除自启动项
        match run_key.delete_value(app_name) {
            Ok(_) => {
                info!("已成功禁用开机自启动: {}", app_name);
            }
            Err(e) => {
                // 如果项不存在，也认为是成功的
                if e.kind() == std::io::ErrorKind::NotFound {
                    debug!("自启动项不存在，无需删除: {}", app_name);
                } else {
                    return Err(format!("删除自启动注册表项失败: {}", e));
                }
            }
        }
    }
    
    #[cfg(not(target_os = "windows"))]
    {
        return Err("当前系统不支持自启动功能".to_string());
    }
    
    Ok(())
}

/// 检查是否已启用开机自启动
/// 
/// # Returns
/// * `Ok(bool)` - true表示已启用，false表示未启用
/// * `Err(String)` - 检查失败，包含错误信息
#[tauri::command]
pub fn is_auto_start_enabled() -> Result<bool, String> {
    debug!("检查开机自启动状态");
    
    #[cfg(target_os = "windows")]
    {
        let app_name = get_app_name();
        
        // 打开注册表项
        let hkcu = RegKey::predef(HKEY_CURRENT_USER);
        let run_key = hkcu
            .open_subkey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")
            .map_err(|e| format!("打开注册表Run项失败: {}", e))?;
        
        // 检查是否存在自启动项
        match run_key.get_value::<String, _>(app_name) {
            Ok(value) => {
                debug!("找到自启动项: {} -> {}", app_name, value);
                Ok(true)
            }
            Err(e) => {
                if e.kind() == std::io::ErrorKind::NotFound {
                    debug!("未找到自启动项: {}", app_name);
                    Ok(false)
                } else {
                    Err(format!("读取自启动注册表项失败: {}", e))
                }
            }
        }
    }
    
    #[cfg(not(target_os = "windows"))]
    {
        Ok(false)
    }
}

/// 设置开机自启动状态
/// 
/// # Arguments
/// * `enabled` - true表示启用，false表示禁用
/// 
/// # Returns
/// * `Ok(())` - 设置成功
/// * `Err(String)` - 设置失败，包含错误信息
#[tauri::command]
pub fn set_auto_start(enabled: bool) -> Result<(), String> {
    if enabled {
        enable_auto_start()
    } else {
        disable_auto_start()
    }
}